package com.prj.ufdm.demo.tutorial.thread;
/**
 * Synchronize 同步测试
 * Synchronize 锁的对象，一定是多个线程可以同时访问到对象
 * @author Administrator
 *
 */
public class TestSynchronized {

	public static void main(String[] args) {
		
		final TestSynchronized testSyn = new TestSynchronized();
		Thread test1 = new Thread(  new Runnable() {  
			public void run() {  
				try {
					while(true) {
					    testSyn.printNameBySynMethod("nnnnnnnnnnnnnnnnnnnn");
					}
				} catch (Exception e) {
					e.printStackTrace();
				}  
			}  
		}, "test1" );  
		test1.start();

		Thread test2 = new Thread(  new Runnable() {  
			public void run() {  
				try {
					while(true) {
					    testSyn.printNameBySynMethod("yyyyyyyyyyyyyyyyyyyy");
					}
				} catch (Exception e) {
					e.printStackTrace();
				}  
			}  
		}, "test2" );  
		test2.start();
	}
	
	/**
	  * 通过 synchronized同步代码块（通过Char数组打印用户名称）
	 * @param userName
	 * @throws Exception
	 */
	public void printName(String userName) throws Exception
    {  
		String lock = "lock";
		/**
		    锁定多个线程可以共享的对象，否则失败。这里如果不加锁，会出现打印不完全的情况。如果锁用 synchronized(userName) ，因为两个线程访问的不同对象，所以锁失效
		    所以这里可以使用两个线程都可以访问的 lock 作为锁，或者使用 this (两个线程都是访问 testSyn 这个对象)   
		 */
		synchronized(lock) 
		{  
		    int i = 5;
		    for(i=0;i<userName.length();i++) {
		    	System.out.print(userName.charAt(i));  
		    }
		    System.out.println();
		}  
    }  
	
	/**
	  * 通过 synchronized 同步方法（通过Char数组打印用户名称）
	 * @param userName
	 * @throws Exception
	 */
	public synchronized void printNameBySynMethod(String userName) throws Exception
    {  
	    int i = 5;
	    for(i=0;i<userName.length();i++) {
	    	System.out.print(userName.charAt(i));  
	    }
	    System.out.println();
    } 

}
